home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
wais
/
ir
/
hash.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-09
|
4KB
|
107 lines
/* hash table routines. not very general.
* -brewster
*/
#ifndef HASH_H
#define HASH_H
#define DEFAULT_NUMBER_OF_BUCKETS 65536L
#define DEFAULT_NUMBER_OF_ELEMENTS 131072L
#define MAX_KEY_SIZE 20 /* this is the string length, so add 1 */
typedef struct hash_entry{
char key[MAX_KEY_SIZE + 1]; /* the key. Must be first */
long next; /* index of the next entry in the contents */
/* This part is usage dependent. Sucks that it is hard coded. (this
* was done for efficiency. C sucks.)
* however, this can be made to be somewhat flexible, by pulling this out
* into a different .h file, and redefining the structure for different
* purposes. This can be done in the same application since all the
* hashtable code cares about is the key and next values.
* (actually, not quite, take out array refs to contents in hash.c
* and replace by explicit multiplies and it will work).
*/
long number_of_occurances; /* total for the whole db */
unsigned char* memory_ptr; /* what will go into the next block */
unsigned char* current_memory_ptr; /* the fill ptr into memory_ptr */
long memory_size; /* the size of memory_ptr */
long current_doc_id; /* the last document-id in memory_ptr
* this will change a page pointer eventually
*/
} hash_entry;
typedef struct hashtable{
long number_of_buckets; /* number of buckets */
long buckets_mask; /* a mask for fast bitwise and'ing */
long element_size; /* sizeof the element to be stored
(including th hash_entry_header) */
long number_of_elements; /* total number of elements hashed */
long max_number_of_elements; /* size of the contents buffer in elements */
long *buckets; /* array of longs, each an index into contents
* -1 is an empty entry. */
hash_entry* contents; /* pointer to hashtable memory */
} hashtable;
#ifdef __cplusplus
/* declare these as C style functions */
extern "C"
{
#endif /* def __cplusplus */
/* number_of_buckets must be a power of 2,
if -1 then it defaults to DEFAULT_NUMBER_OF_BUCKETS.
number_of_elements is the number of expected elements that will be hashed.
element_size must be the sizeof the element to be put in the hashtable
(not including hash_entry_header).
returns NULL if an error
*/
hashtable *make_hashtable _AP ((long number_of_buckets,
long number_of_elements,
long element_size));
/* returns a pointer to the element stored or NULL if none. */
hash_entry *get_hash _AP ((char *key, hashtable *htable));
/* puts a copy of the element into the hashtable.
Returns a pointer to the new element.
This does not check to see that the key has not already been added. */
hash_entry *put_hash _AP ((char *key, hashtable *htable, hash_entry *element));
/* not implemented yet
boolean rem_hash _AP ((char *key, hashtable *htable));
*/
/* removes contents without freeing memory.
returns true if successful, false otherwise */
boolean clr_hashtable _AP ((hashtable *htable));
/* removes contents and free's memory for the hastable.
returns true if successful, false otherwise */
boolean free_hashtable _AP ((hashtable *htable));
long hashtable_count _AP ((hashtable *htable));
/* sorts the contents of elements of the hastable.
this destroys the hashtable */
boolean sort_hashtable _AP ((hashtable *htable));
void analyze_hashtable_distribution _AP ((hashtable * htable));
void print_hashtable _AP ((hashtable *htable));
#ifdef __cplusplus
}
#endif /* def __cplusplus */
#endif /* nded HASH_H */